﻿/*
 * Script: "mapa_buscador.js"
 * Copyright 2011 SISVOX.
 *
 * Licenciado bajo SISVOX, Version 1.0 (la "Licencia");
 * El codigo presente que compone este Software es propiedad unica y
 * exclusivamente de SISVOX, por lo tanto, usted no podrá utilizar este
 * archivo excepto en cumplimiento de la Licencia ofrecida por SISVOX.
 * Usted puede obtener una copia de la Licencia en:
 *
 *      Soluciones Integrales de Software Vox (SISVOX)
 *                 http://www.sisvox.com
 *
 *     - Carlos Calvo      <ccalvo@sisvox.com>
 *     - Andres Hernandez  <ahernandez@sisvox.com>
 *
 * A menos que sea requerido por la ley aplicable o se acuerde por escrito,
 * el software distribuido bajo la licencia se distribuye "TAL CUAL", CON
 * LAS GARANTIAS Y CONDICIONES expresadas en la "Licencia".
 */
 
 
// Inicialización de Variables

var map				= null;
var icono 			= new GIcon();
var ancho_peq 		= 0;
var alto_peq 		= 0;
var ancho_med 		= 0;
var alto_med 		= 0;
var bounds			= null;

// Parametros del Circulo
var radio			= 150;			// Radio de la Circunferencia
//var radio			= 0.100;		// Radio de la Circunferencia
var calidad 		= 100;			// Calidad del Circulo (Puntos que lo Conforman)
var color 			= "#FF0000"; 	// Color de la Linea de Borde del Circulo: Rojo
var fillcolor 		= "#FFFF00";	// Color del Relleno del Circulo: Amarillo
var thick 			= 1;			// Ancho de la Linea de Borde
var op 				= 0.4;			// Opacidad

// Variables donde se guardan los datos a mostrar
var lista_id_senal 			= null;
var lista_coord_x 			= null;
var lista_coord_y 			= null;
var lista_id_tipo_sen 		= null;
var lista_id_categ_sen 		= null;
var lista_id_senal_tra 		= null;
var lista_desc_image_sen 	= null;
var lista_id_estad_sen 		= null;
var lista_id_status_sen 	= null;

var lista_tipo_sen_id 		= null;
var lista_tipo_sen_nombre 	= null;
var nombre_tipo_sen 		= new Array();
var lista_categ_sen_id 		= null;
var lista_categ_sen_desc	= null;
var nombre_categ_sen 		= new Array();
var lista_senal_tra_id 		= null;
var lista_senal_tra_nombre 	= null;
var nombre_senal_tra 		= new Array();
var lista_estad_sen_id 		= null;
var lista_estad_sen_nombre 	= null;
var nombre_estad_sen 		= new Array();

// Dimension de las Imagenes
var lista_img_id 			= null;
var lista_img_ancho_peq 	= null;
var lista_img_alto_peq 		= null;
var lista_img_ancho_med 	= null;
var lista_img_alto_med 		= null;
var img_dimension_ancho_peq = new Array();
var img_dimension_alto_peq 	= new Array();
var img_dimension_ancho_med = new Array();
var img_dimension_alto_med 	= new Array();

var iwTemplates 			= null;


// =================================================================================================================
// ====================================================== BUSCADOR =================================================
// =================================================================================================================

// Funcion que carga el Mapa de Buscador

function buscador( opcion ) {
	if (GBrowserIsCompatible()) {
		
		// Creamos el Mapa	
		map = new GMap2(document.getElementById("mapa_buscador"));													// Nos aseguramos de darle el mismo ID del DIV
		map.addControl(new GScaleControl());																		// Agregamos las Escalas del Mapa
		map.addControl(new GLargeMapControl());																		// Agregamos los Controles del Zoom
		map.setCenter(new GLatLng( parseInt(mapa_coord_x), parseInt(mapa_coord_y) ), parseInt(mapa_zoom) );			// Seteamos la Posicion y el Zoom Inicial del Mapa
		map.enableScrollWheelZoom();																				// Habilitamos el Zoom por Scroll
		
		GEvent.addListener(map,"click",function(overlay,point) {
			if (point) {
				// Limpiamos el Mapa
				map.clearOverlays();
				bounds = new GLatLngBounds();
				
				// Sacamos las Coordenadas porque no podemos pasar el Punto
				coord_x_c = point.lat();
				coord_y_c = point.lng();
				
				// Para determinar el Diametro que debe tener el Circulo que se pinta en el Mapa (POR DETERMINAR)
				/*
				llat1 	= "10.479831";
				llon1 	= "-66.916083";
				//punto1 	= new GLatLng( llat1, llon1 );
				punto1 	= new LatLon( llat1, llon1 );
				
				llat2 	= "10.479156";
				llon2 	= "-66.915783";
				//punto2 	= new GLatLng( llat2, llon2 );
				punto2 	= new LatLon( llat2, llon2 );
				
				// CALIFORNIA
				llat1 	= "10.481893";
				llon1 	= "-66.818552";
				//punto1 	= new GLatLng( llat1, llon1 );
				punto1 	= new LatLon( llat1, llon1 );
				
				llat2 	= "10.481398";
				llon2 	= "-66.819180";
				//punto2 	= new GLatLng( llat2, llon2 );
				punto2 	= new LatLon( llat2, llon2 );
				
				radio_b = punto1.distanceTo(punto2)
				//alert("El radio es: " + radio_b);
				// Buscamos los Posibles Resultado*/
				
				
				xajax_buscador_xajax(radio, coord_x_c, coord_y_c, opcion);
			}
		});
	} else {
		alert("Disculpe, el Mapa del Buscador de Señales de Tránsito no es compatible con su navegador.");
	}
}


// =================================================================================================================
// ================================================= PINTAR CIRCULO ================================================
// =================================================================================================================

// (El circulo representa el Area de Busqueda y esta definido por un radio fijo)

function pintar_circulo(coord_x_c, coord_y_c, radio) {
	if (GBrowserIsCompatible()) {
		// Armamos el Punto ya que no se puede pasar como parametro (es un Objeto)
		point 	= new GLatLng(coord_x_c, coord_y_c);
		
		var latConv = point.distanceFrom(new GLatLng(Number(point.lat())+Number(0.1), point.lng()))/100;
		var lngConv = point.distanceFrom(new GLatLng(point.lat(), Number(point.lng())+Number(0.1)))/100;
	
		var points = [];
		var step = parseInt(360/calidad)||10;
		
		for(var i=0; i<=360; i+=step) {
			var pint = new GLatLng(Number(point.lat()) + Number((radio/latConv * Math.cos(i * Math.PI/180))), Number(point.lng()) + 	Number((radio/lngConv * Math.sin(i * Math.PI/180))));
			points.push(pint);
			bounds.extend(pint); //this is for fit function
		}
		poly = new GPolygon(points,color,thick,1,fillcolor,op);
		map.addOverlay(poly);
		
		// Guardamos los valores del Area de Busqueda
		bounds.extend(point);
}	}


// =================================================================================================================
// ====================================== HACER ZOOM SOBRE EL AREA DE BUSQUEDA =====================================
// =================================================================================================================

function zoom_area() {
	map.setZoom(map.getBoundsZoomLevel(bounds));
	map.setCenter(bounds.getCenter());
}


// =================================================================================================================
// ========================================== CARGA EL DIV DE LOS INFOWINDOW =======================================
// =================================================================================================================

function cargar_div_info_window() {
	iwTemplates = Array();
	var oTemplateContainers = document.getElementById('infoWindow_buscador');
	var children = oTemplateContainers.getElementsByTagName('DIV');
	for (var c = 0 ; c < children.length ; c++ ) {
		var childObj = children[c];
		if (childObj.className == 'iwTabContainer') {
			iwTemplates.push(childObj);
		}
	}
}


// =================================================================================================================
// ========================================= INICALIZAR LOS DATOS DEL MAPA =========================================
// =================================================================================================================

function inicializar_datos() {
	
	var h_ls_coord_x 			= document.getElementById("h_ls_coord_x").value;
	lista_coord_x 				= h_ls_coord_x.split( "/*" );
	
	var h_ls_coord_y 			= document.getElementById("h_ls_coord_y").value;
	lista_coord_y 				= h_ls_coord_y.split( "/*" );
	
	var h_ls_id_tipo_sen 		= document.getElementById("h_ls_id_tipo_sen").value;
	lista_id_tipo_sen 			= h_ls_id_tipo_sen.split( "/*" );
	
	var h_ls_id_categ_sen 		= document.getElementById("h_ls_id_categ_sen").value;
	lista_id_categ_sen 			= h_ls_id_categ_sen.split( "/*" );
	
	var h_ls_id_senal_tra 		= document.getElementById("h_ls_id_senal_tra").value;
	lista_id_senal_tra 			= h_ls_id_senal_tra.split( "/*" );
	
	var h_ls_desc_image_sen 	= document.getElementById("h_ls_desc_image_sen").value;
	lista_desc_image_sen 		= h_ls_desc_image_sen.split( "/*" );
	
	var h_ls_id_estad_sen 		= document.getElementById("h_ls_id_estad_sen").value;
	lista_id_estad_sen 			= h_ls_id_estad_sen.split( "/*" );
	
	var h_ls_id_status_sen 		= document.getElementById("h_ls_id_status_sen").value;
	lista_id_status_sen 			= h_ls_id_status_sen.split( "/*" );
	
	
	var h_ls_tipo_sen_id 		= document.getElementById("h_ls_tipo_sen_id").value;
	lista_tipo_sen_id 			= h_ls_tipo_sen_id.split( "/*" );
	
	var h_ls_tipo_sen_nombre 	= document.getElementById("h_ls_tipo_sen_nombre").value;
	lista_tipo_sen_nombre 		= h_ls_tipo_sen_nombre.split( "/*" );
	
	nombre_tipo_sen = new Array();
	for ( i = 0; i < lista_tipo_sen_id.length - 1; i++ ) {
		nombre_tipo_sen[lista_tipo_sen_id[i]] 		= lista_tipo_sen_nombre[i];
	}
	
	var h_ls_categ_sen_id 		= document.getElementById("h_ls_categ_sen_id").value;
	lista_categ_sen_id 			= h_ls_categ_sen_id.split( "/*" );
	
	var h_ls_categ_sen_nombre 	= document.getElementById("h_ls_categ_sen_nombre").value;
	lista_categ_sen_nombre		= h_ls_categ_sen_nombre.split( "/*" );
	
	nombre_categ_sen = new Array();
	for ( i = 0; i < lista_categ_sen_id.length - 1; i++ ) {
		nombre_categ_sen[lista_categ_sen_id[i]] 	= lista_categ_sen_nombre[i];
	}
	
	var h_ls_senal_tra_id 		= document.getElementById("h_ls_senal_tra_id").value;
	lista_senal_tra_id 			= h_ls_senal_tra_id.split( "/*" );
	
	var h_ls_senal_tra_nombre 	= document.getElementById("h_ls_senal_tra_nombre").value;
	lista_senal_tra_nombre 		= h_ls_senal_tra_nombre.split( "/*" );
	
	nombre_senal_tra = new Array();
	for ( i = 0; i < lista_senal_tra_id.length - 1; i++ ) {
		nombre_senal_tra[lista_senal_tra_id[i]] 	= lista_senal_tra_nombre[i];
	}
	
	var h_ls_estad_sen_id 		= document.getElementById("h_ls_estad_sen_id").value;
	lista_estad_sen_id 			= h_ls_estad_sen_id.split( "/*" );
	
	var h_ls_estad_sen_nombre 	= document.getElementById("h_ls_estad_sen_nombre").value;
	lista_estad_sen_nombre 		= h_ls_estad_sen_nombre.split( "/*" );
	
	nombre_estad_sen = new Array();
	for ( i = 0; i < lista_estad_sen_id.length - 1; i++ ) {
		nombre_estad_sen[lista_estad_sen_id[i]] 	= lista_estad_sen_nombre[i];
	}
	
	
	// Dimension de las Imagenes
	
	var h_ls_img_id 			= document.getElementById("h_ls_img_id").value;
	lista_img_id 				= h_ls_img_id.split( "/*" );
	
	var h_ls_img_ancho_peq 		= document.getElementById("h_ls_img_ancho_peq").value;
	lista_img_ancho_peq 		= h_ls_img_ancho_peq.split( "/*" );
	
	var h_ls_img_alto_peq 		= document.getElementById("h_ls_img_alto_peq").value;
	lista_img_alto_peq 			= h_ls_img_alto_peq.split( "/*" );
	
	var h_ls_img_ancho_med 		= document.getElementById("h_ls_img_ancho_med").value;
	lista_img_ancho_med 		= h_ls_img_ancho_med.split( "/*" );
	
	var h_ls_img_alto_med 		= document.getElementById("h_ls_img_alto_med").value;
	lista_img_alto_med			= h_ls_img_alto_med.split( "/*" );
	
	img_dimension_ancho_peq 	= new Array();
	img_dimension_alto_peq 		= new Array();
	img_dimension_ancho_med 	= new Array();
	img_dimension_alto_med 		= new Array();
	for ( i = 0; i < lista_img_id.length - 1; i++ ) {
		img_dimension_ancho_peq[lista_img_id[i]] 	= lista_img_ancho_peq[i];
		img_dimension_alto_peq[lista_img_id[i]] 	= lista_img_alto_peq[i];
		img_dimension_ancho_med[lista_img_id[i]] 	= lista_img_ancho_med[i];
		img_dimension_alto_med[lista_img_id[i]] 	= lista_img_alto_med[i];
	}
}


// =================================================================================================================
// ================================================ VERIFICAR Y PINTAR =============================================
// =================================================================================================================

function verificar_y_pintar(radio, lat, lng, opcion) {
	
	if (GBrowserIsCompatible()) {
		// Parseamos los Posibles Resultados
		var h_ls_id_senal 			= document.getElementById("h_ls_id_senal").value;
		lista_id_senal 				= h_ls_id_senal.split( "/*" );
		
		if ( lista_id_senal.length > 1 ) {
			
			// Cargamos los Datos del Div InfoWindow
			cargar_div_info_window();
			
			// Inicializamos los Datos a Pintar
			inicializar_datos();
			
			// Coordenada del Centro del Area de Busqueda
			var centro = new LatLon(lat, lng);
			
			// Inicializamos y Seteamos las Variables de los Marcadores
			icono = new GIcon();
			var turno;
			var distancia_turno;
			var h_ls_tabla_sen = "";
			
			// Para todos los Posibles Resultados
			for ( j = 0; j < lista_id_senal.length; j++ ) {
				
				// Coordenada del Posible Resultado de Turno
				turno = new LatLon(lista_coord_x[j], lista_coord_y[j]);
				distancia_turno = centro.distanceTo(turno)
				
				// Si la Señal esta dentro del Area de Busqueda
				if (radio > distancia_turno) {
					
					h_ls_tabla_sen = h_ls_tabla_sen + lista_id_senal[j] + "," + distancia_turno + ";";
					
					// Obtenemos los atributos de cada Marcador
					var point 		= new GLatLng( lista_coord_x[j], lista_coord_y[j] );
					
					icono.image 			= "../../publico/imagenes/senales/peq/" + lista_desc_image_sen[j] + ".gif";
					icono.shadow 			= "../../publico/imagenes/senales/shadow.png";
					
					ancho_peq 	= img_dimension_ancho_peq[lista_id_senal_tra[j]];
					alto_peq 	= img_dimension_alto_peq[lista_id_senal_tra[j]];
					ancho_med 	= img_dimension_ancho_med[lista_id_senal_tra[j]];
					alto_med 	= img_dimension_alto_med[lista_id_senal_tra[j]];
		
					setear_dimension_imagen( lista_desc_image_sen[j] );
					
					icono.iconSize 			= new GSize(ancho_peq, alto_peq);
					
					icono.shadowSize 		= new GSize(50, 25);
					icono.iconAnchor 		= new GPoint(0, 0);
					icono.infoWindowAnchor 	= new GPoint(10, 14);
					
					image_sen = lista_desc_image_sen[j];
					
					
					var infoTabs = Array();
					for (var c = 0 ; c < iwTemplates.length ; c++ ) {
						
						var html = iwTemplates[c].innerHTML;
						html = html.replace("%%element.id_senal%%",				lista_id_senal[j]);
						
						// Si el Tab es Señal
						if ( c == 0 ) {
							html = html.replace("%%element.nombre_tipo_sen%%",		nombre_tipo_sen[lista_id_tipo_sen[j]]);
							html = html.replace("%%element.nombre_categ_sen%%",		nombre_categ_sen[lista_id_categ_sen[j]]);
							html = html.replace("%%element.nombre_senal_tra%%",		nombre_senal_tra[lista_id_senal_tra[j]]);
							html = html.replace("%%element.nombre_estad_sen%%",		nombre_estad_sen[lista_id_estad_sen[j]]);
							html = html.replace("%%element.id_status%%",			lista_id_status_sen[j]);
						}
						
						// Si el Tab es Imagen
						if ( c == 1 ) {
							html = html.replace("%%element.desc_image_sen%%",			"<img src='../../publico/imagenes/senales/med/" + lista_desc_image_sen[j] + ".gif' title='" + nombre_senal_tra[lista_id_senal_tra[j]] + "' alt='" + nombre_senal_tra[lista_id_senal_tra[j]] + "'/>");
						}
						
						var tabTitle = iwTemplates[c].title ? iwTemplates[c].title : "Tab " + c;
						var newTab = new GInfoWindowTab(tabTitle, html);
						infoTabs.push(newTab);
					}
					
					// Creamos el Marcador
					var marker = createMarker(point, icono, nombre_senal_tra[lista_id_senal_tra[j]], infoTabs);
					
					// Agregamos el Marcador al Mapa
					map.addOverlay(marker);
				}
			}
			
			if ( h_ls_tabla_sen != "" ) {
				document.getElementById("h_ls_tabla_sen").value = h_ls_tabla_sen;
			} else {
				document.getElementById("h_ls_tabla_sen").value = "";
			}

			// Llamamos al AJAX que crea la Tabla con h_ls_tabla_sen como parametro
			xajax_generar_tabla_sen_xajax(h_ls_tabla_sen, opcion);
		} else {
			alert("ATENCIÓN: No se encontraron Señales de Tránsito en el Área seleccionada.");
		}
	}
}


// =================================================================================================================
// ============================== CREA UN MARCADOR Y SETEA LOS EVENTOS EN EL MAPA ==================================
// =================================================================================================================

function createMarker( point, icono, nombre, infoTabs ) {
	var marker = new GMarker(point, {icon:icono, title:nombre});
	GEvent.addListener(marker, "click", function() {
		marker.openInfoWindowTabsHtml(infoTabs);
	});
	
	return marker;
}